package net.hands.common;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Properties;
/**
 * 
* 说明:协议类型
* <br>
 * <p>这是一个开源的软件，请在LGPLv3下合法使用、修改或重新发布。</p>
 * @author 陈侃(cknet@126.com, 13910090885)
 *         http://code.google.com/p/simpleframework/
 *         http://www.simpleframework.net
 */
public class MimeTypes {
   /**
    * 应用程序输出 xml格式协议
    */
	public static final String MIME_APPLICATION_ATOM_XML = "application/atom+xml";
	/**
	 *  应用程序输出json格式协议 
	 */
	public static final String MIME_APPLICATION_JSON = "application/json";
	/**
	 * 应用程序输出 数据流协议
	 */
	public static final String MIME_APPLICATION_OCTET_STREAM = "application/octet-stream";
	/**
	 * 应用程序输出 文本协议
	 */
	public static final String MIME_TEXT_PLAIN = "text/plain";
	/**
	 * 应用程序输出 html格式文本协议
	 */
	public static final String MIME_TEXT_HTML = "text/html";
   /**
    * 类型协议容器
    */
	private static final HashMap<String, String> MIME_TYPE_MAP;

	static {
		//协议属性文件
		final Properties mimes = new Properties();
      //输出流 MimeTypes.properties 属性文件
		final InputStream is = MimeTypes.class.getResourceAsStream(MimeTypes.class.getSimpleName()
				+ ".properties");
		if (is == null) {
			//扔出异常
			throw new IllegalStateException("Mime types file missing");
		}

		try {
			mimes.load(is);//加载协议属性文件
		} catch (final IOException ioex) {
			throw new IllegalStateException(ioex.getMessage());
		} finally {
			try {
				is.close();
			} catch (final IOException ioex) {
			}
		}
      /*
       * 初始化协议类型容器  大小为属性文件项个数
       */
		MIME_TYPE_MAP = new HashMap<String, String>(mimes.size() * 2);
      /*
       * 获得协议类型属性文件主键
       */
		final Enumeration<?> keys = mimes.propertyNames();
		while (keys.hasMoreElements()) {//循环主键
			String mimeType = (String) keys.nextElement();
			final String extensions = mimes.getProperty(mimeType);//获得对应值

			if (mimeType.startsWith("/")) {//应用
				mimeType = "application" + mimeType;
			} else if (mimeType.startsWith("a/")) {//声音
				mimeType = "audio" + mimeType.substring(1);
			} else if (mimeType.startsWith("i/")) {//图片
				mimeType = "image" + mimeType.substring(1);
			} else if (mimeType.startsWith("t/")) {//文本
				mimeType = "text" + mimeType.substring(1);
			} else if (mimeType.startsWith("v/")) {//视频
				mimeType = "video" + mimeType.substring(1);
			}
         //所有扩展
			final String[] allExtensions = StringUtils.split(extensions, " ");//" "分隔值

			for (final String extension : allExtensions) {//循环所有扩展
				if (MIME_TYPE_MAP.put(extension, mimeType) != null) {//插入协议类型容器
					throw new IllegalArgumentException("Duplicated extension: " + extension);
				}
			}
		}
	}
   /**
   * 说明:协议类型容器中登记协议类型
   * @param ext 扩展字符为主键
   * @param mimeType  协议类型为值
   * @update 2012-9-24 下午10:56:01
    */
	public static void registerMimeType(final String ext, final String mimeType) {
		MIME_TYPE_MAP.put(ext, mimeType);
	} 
   /**
   * 说明:获得协议类型 无这协议返回数据量协议
   * @param ext 扩展
   * @return String   
   * @update 2012-9-24 下午10:57:06
    */
	public static String getMimeType(final String ext) {
		String mimeType = lookupMimeType(ext);
		if (mimeType == null) {//类型为空
			mimeType = MIME_APPLICATION_OCTET_STREAM;
		}
		return mimeType;
	}
   /**
   * 说明:检出协议类型
   * @param ext  扩展
   * @return String  
   * @update 2012-9-24 下午10:59:35
    */
	public static String lookupMimeType(final String ext) {
		return MIME_TYPE_MAP.get(ext.toLowerCase());
	}
}